package com.sheng.leetcode.year2022.month07.day16;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author liusheng
 * @date 2022/07/18
 *
 * 剑指 Offer II 041. 滑动窗口的平均值
 *
 * 给定一个整数数据流和一个窗口大小，根据该滑动窗口的大小，计算滑动窗口里所有数字的平均值。
 * 实现 MovingAverage 类：
 * MovingAverage(int size) 用窗口大小 size 初始化对象。
 * double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数，
 * 请计算并返回数据流中最后 size 个值的移动平均值，即滑动窗口里所有数字的平均值。
 *  
 * 示例：
 *
 * 输入：
 * inputs = ["MovingAverage", "next", "next", "next", "next"]
 * inputs = [[3], [1], [10], [3], [5]]
 * 输出：
 * [null, 1.0, 5.5, 4.66667, 6.0]
 *
 * 解释：
 * MovingAverage movingAverage = new MovingAverage(3);
 * movingAverage.next(1); // 返回 1.0 = 1 / 1
 * movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
 * movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
 * movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
 *
 * 提示：
 * 1 <= size <= 1000
 * -105 <= val <= 105
 * 最多调用 next 方法 104 次
 *
 * 注意：本题与主站 346 题相同： https://leetcode-cn.com/problems/moving-average-from-data-stream/
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/qIsx9U
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCodeMovingAverage {

    @Test
    public void test01() {
        MovingAverage obj = new MovingAverage(3);
        System.out.println(obj.next(1));
        System.out.println(obj.next(10));
        System.out.println(obj.next(3));
        System.out.println(obj.next(5));
    }

}
class MovingAverage {

    List<Integer> lists;
    int index;

    /** Initialize your data structure here. */
    public MovingAverage(int size) {
        lists = new ArrayList<>();
        index = size;
    }

    public double next(int val) {
        lists.add(val);
        double add = 0;
        if (lists.size() >= index) {
            for (int i = lists.size() - 1; i > lists.size() - 1 - index; i--) {
                add += lists.get(i);
            }
            return add / index;
        } else {
            for (int i = 0; i < lists.size(); i++) {
                add += lists.get(i);
            }
            return add / lists.size();
        }
    }
}

/**
 * Your MovingAverage object will be instantiated and called as such:
 * MovingAverage obj = new MovingAverage(size);
 * double param_1 = obj.next(val);
 */

//class MovingAverage {
//    int[] arr = new int[10010];
//    int n, sum, j, i;
//    public MovingAverage(int size) {
//        n = size;
//    }
//    public double next(int val) {
//        sum += arr[i++] = val;
//        if (i - j > n) sum -= arr[j++];
//        return sum * 1.0 / (i - j);
//    }
//}
//
//作者：AC_OIer
//链接：https://leetcode.cn/problems/qIsx9U/solution/by-ac_oier-g5ha/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
